package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

/*
模型绑定
可以接受请求的数据直接绑定到结构体，最常用的方式
*/

type UserInfo struct {
	Id       int    `json:"id"`
	Username string `json:"username"`
	Token    string `json:"token"`
	Age      int    `json:"age"`
	Address  string `json:"address"`
}

var userinfo UserInfo

/*
验证token,如果token不存在，则终止请求
*/
func tokenIdentified(c *gin.Context) {
	if err := c.ShouldBindJSON(&userinfo); err != nil {
		fmt.Println("数据绑定失败:", err.Error())
		c.JSON(http.StatusOK, gin.H{
			"message": "参数格式不正确",
			"status":  500,
		})
	} else {
		if userinfo.Token == "" {
			c.JSON(401, gin.H{
				"message": "用户未登录,请先登录",
			})
			c.Abort() // 终止请求
		} else {
			c.JSON(http.StatusOK, gin.H{
				"message": "登录成功",
			})
		}
	}
}

/*
验证用户权限，只有admin账号有删除权限
如果不是admin,则终止请求
*/
func withAuth(c *gin.Context) {
	if userinfo.Username != "admin" {
		c.JSON(403, gin.H{
			"message": "该用户没有权限执行此操作",
		})
		c.Abort()
	} else {
		c.JSON(http.StatusOK, gin.H{
			"message": "正在进行删除操作",
		})
	}
}

/*
用户删除
*/
func delUser(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"message": "用户删除成功",
	})
}

func main() {
	// 创建路由
	r := gin.Default()

	// 路由路径和逻辑处理
	apiGroup := r.Group("/api")
	// 全局中间件,对/api接口的访问进行token验证
	apiGroup.Use(tokenIdentified)
	userGroup := apiGroup.Group("/user")
	// 局部中间件,对删除操作进行用户权限验证
	userGroup.POST("/del", withAuth, delUser)
	// 运行
	r.Run()
}
